Fowler–Noll–Vo Hash
#Hash
実装が簡単でそれなりに速いハッシュ関数。FNV-1とFNV-1aの2つのバリアントがある。
GLSLによる実装。uint を使っているので GLSL ES 3.0 以上じゃないと動かない。
code:glsl
// Fowler-Noll-Vo hash function
// http://www.isthe.com/chongo/tech/comp/fnv/
uint FNV_1a(uint src1, uint src2) {
uint hash = 2166136261u;
#define FNV_BYTE(src, i) hash ^= (src >> (8*i)) & 0xffu; hash *= 16777619u;
#define FNV_UINT(src) FNV_BYTE(src, 0) FNV_BYTE(src, 1) FNV_BYTE(src, 2) FNV_BYTE(src, 3)
FNV_UINT(src1) FNV_UINT(src2)
#undef FNV_UINT
#undef FNV_BYTE
return hash;
}
float hash12(vec2 p) {
uint h = FNV_1a(floatBitsToUint(p.x), floatBitsToUint(p.y));
return float(h) / 4294967295.0;
}
この用途に使うなら FNVハッシュじゃなくてMurmurHashのほうがよさそう。
References
https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function
http://www.isthe.com/chongo/tech/comp/fnv/